from TTS.api import TTS
from pydub import AudioSegment

# 指定中文模型名称
model_name = "tts_models/zh-CN/baker/tacotron2-DDC-GST"
# 指定声码器名称
vocoder_name = "vocoder_models/zh-CN/baker/hifigan_v2"

# 创建 TTS 对象，同时指定模型和声码器
tts = TTS(model_name=model_name, vocoder_path=vocoder_name)

# 遍历 chapter01.txt 到 chapter80.txt
for i in range(1, 81):
    # 格式化文件名
    chapter_num = str(i).zfill(2)  # 将数字转换为两位字符串，如 1 转换为 01
    file_path = f"chapter{chapter_num}.txt"
    output_file = f"chapter{chapter_num}.wav"

    try:
        # 用于存储当前章节的所有音频片段
        audio_segments = []

        # 读取文本文件内容
        with open(file_path, 'r', encoding='utf-8') as file:
            lines = file.readlines()

        prev = ""
        for line_num, line in enumerate(lines):
            line = line.strip()
            if line:
                # 为每行生成唯一的临时音频文件名
                if len(line) < 10:
                    prev += line.strip('\r\n ')
                    #MUST add chinese end symbol or the audio output will be noises.
                    prev += "。"
                else:
                    temp_output_file = f"temp_chapter{chapter_num}_line{line_num + 1}.wav"
                    # 合成语音并保存为临时文件
                    tts.tts_to_file(text=prev + line + "。", file_path=temp_output_file)
                    print(f"line content: {prev + line} end")
                    print(f"已完成 {file_path} 第 {line_num + 1} 行的语音合成，音频保存为 {temp_output_file}")
                    prev = ""
                    # 加载临时音频文件
                    audio = AudioSegment.from_wav(temp_output_file)
                    audio_segments.append(audio)
        if prev!="":
           temp_output_file = f"temp_chapter{chapter_num}_line_last.wav"
           # 合成语音并保存为临时文件
           tts.tts_to_file(text=prev, file_path=temp_output_file)
           print(f"已完成 {file_path} 第 last 行的语音合成，音频保存为 {temp_output_file}")
           prev = ""
           # 加载临时音频文件
           audio = AudioSegment.from_wav(temp_output_file)
           audio_segments.append(audio)

        # 合并当前章节的所有音频片段
        if audio_segments:
            combined_audio = audio_segments[0]
            for audio in audio_segments[1:]:
                combined_audio += audio

            # 保存合并后的音频文件
            combined_audio.export(output_file, format="wav")
            print(f"已完成 {file_path} 的语音合成，合并后的音频保存为 {output_file}")

            # 删除临时音频文件
            for line_num in range(len(lines)):
                temp_output_file = f"temp_chapter{chapter_num}_line{line_num + 1}.wav"
                if os.path.exists(temp_output_file):
                    os.remove(temp_output_file)

    except FileNotFoundError:
        print(f"错误：未找到文件 {file_path}")
    except Exception as e:
        print(f"处理 {file_path} 时发生未知错误：{e}")
